<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // 执行方法
    hw.next()
    // { value: 'hello', done: false }

    hw.next()
    // { value: 'world', done: false }

    hw.next()
    // { value: 'ending', done: true }

    hw.next()
    // { value: undefined, done: true }

    // 第一次调用 Generator函数开始执行 直到遇到yield表达式为止
    // next方法返回一个对象 它的value属性就是当前yield表达式的值hello
    // done属性的值false 表示遍历还没结束


    // 第二次调用 Generator 函数从上次yield表达式停下的地方 一直执行到下一个yield表达式 
    // next方法返回的对象的value属性就是当前yield表达式的值world 
    // done属性的值false 表示遍历还没有结束

    // 第三次调用 Generator 函数从上次yield表达式停下的地方 一直执行到return语句（如果没有return语句，就执行到函数结束）
    // next方法返回的对象的value属性 就是紧跟在return语句后面的表达式的值（如果没有return语句，则value属性的值为undefined）
    // done属性的值true，表示遍历已经结束。

    // 第四次调用 此时 Generator 函数已经运行完毕
    // next方法返回对象的value属性为undefined
    // done属性为true 以后再调用next方法 返回的都是这个值

    // 调用Generator函数 返回一个遍历器对象 代表Generator函数的内部指针
    // 以后 每次调用遍历器对象的next方法 就会返回一个有value和done两个属性的对象
    // value属性表示当前的内部状态值 是yield表达式后面那个表达式的值
    // done属性是布尔值 表示遍历是否结束


    // yield表达式
    // 由于Generator函数返回的遍历器对象 只有调用next方法才会遍历下一个内部状态
    // 所以提供了一种可以暂停执行的函数 yield函数就是暂停标志

    // 遍历器对象的next方法运行逻辑如下
    // 1. 遇到yield表达式 就会暂停执行后面的操作 并将紧跟在yield后面那个表达式的值 作为返回对象的value属性的值
    // 2. 下次调用next方法时 再继续往下执行 直到遇到下一个yield表达式
    // 3. 如果没有再遇到新的yield表达式 就一直运行到函数结束 直到return 语句为止 并将return语句后面的表达式的值 作为返回的对象的value属性值
    // 4. 如果该函数没有return语句 则返回的对象的value属性的值为undefined


    // yield表达式只能用在Generator函数里面 用在其他地方都会报错




</script>